package com.waitingsnow.common.share.netEaseMicroblog.statuses
{
	import com.waitingsnow.common.share.bridia.net.BDHttpLoader;
	import com.waitingsnow.common.share.bridia.net.oauth.BDOAuthConnection;
	import com.waitingsnow.common.share.netEaseMicroblog.NEMicroblog;
	import com.waitingsnow.common.share.netEaseMicroblog.data.NEMConfig;
	import com.waitingsnow.common.share.netEaseMicroblog.data.NEMObject;
	
	import flash.events.Event;
	import flash.events.IOErrorEvent;
	import flash.net.URLRequest;
	import flash.utils.ByteArray;
	
	/**
	 * 
	 * @author Tensharp
	 * 
	 * <p>访问所有statuses(微博)接口</p>
	 * 
	 */	
	
	public class NEMStatuses extends NEMObject
	{
		/**
		 * <p>1小时内,top_retweets接口使用.</p> 
		 */		
		
		public static const TOP_RETWEETS_ONE_HOUR:String  = "oneHour";
		
		/**
		 * <p>6小时内,top_retweets接口使用.</p> 
		 */	
		
		public static const TOP_RETWEETS_SIX_HOURS:String = "sixHours";
		
		/**
		 * <p>1天内,top_retweets接口使用.</p> 
		 */	
		
		public static const TOP_RETWEETS_ONE_DAY:String   = "oneDay";
		
		/**
		 * <p>1周内,top_retweets接口使用.</p> 
		 */	
		
		public static const TOP_RETWEETS_ONE_WEEK:String  = "oneWeek";
		
		/**
		 * @private
		 * 
		 * <p>上传文件</p> 
		 */
		
		protected var uploader:BDHttpLoader;
		
		/**
		 * 
		 * <p>创建一个新的NEMStatuses对象.</p>
		 *  
		 * @param parent 上级对象.(NEMicroblog)
		 * @param oauth OAuth链接
		 * 
		 */		
		
		public function NEMStatuses (parent:NEMicroblog, oauth:BDOAuthConnection)
		{
			super (parent, oauth);
		}
		
		///
		///	[Update]
		///
		
		/**
		 * 
		 * <p>statuses/update</p>
		 * <p>发布一条新微博</p>
		 * <ul>
		 * 	<li>微博内容过长则返回403状态;</li>
		 * 	<li>发布失败则返回500状态;</li>
		 * </ul>
		 * <p>注意：本接口不能直接传图，如果发带图片的微博，请先调用上传图片(statuses/upload)得到upload_image_url后，再调用statuses/update，并将upload_image_url作为作为status参数值</p>
		 * 
		 * @param status 必选参数 : 微博内容，不得超过163个字符；
		 * @param lat 	 可选参数 : 即纬度。范围在+90.0 到 -90.0，如果超出这个范围则忽略该值，必须与long参数一起使用，否则忽略该值。只有当用户的geo_enable为true时才有效；
		 * @param long 	 可选参数 : 即经度。范围在+180.0到-180.0，如果超出这个范围则忽略该值，必须与lat参数一起使用，否则忽略该值。只有当用户的geo_enable为true时才有效；
		 * @param vid 	 可选参数 : 即 POI 的 ID，某一个具体的地点，比如天安门。
		 * 
		 */	
		
		public function update (status:String, lat:String = null, long:String = null, vid:String = null):void
		{
			oauth.addOAuthParameters ("status", status, true);
			oauth.addOAuthParameters ("lat", lat, true);
			oauth.addOAuthParameters ("long", long, true);
			oauth.addOAuthParameters ("vid", vid, true);
			
			//
			
			super.connect ("UPDATE", "POST");
		}
		
		///
		///	[Reply]
		///
		
		/**
		 * <p>statuses/reply</p>
		 * <p>评论一条微博</p>
		 * 
		 * @param id 				 必选参数 : 值为被评论微博的ID。如果回复某条评论，则此值为该评论的id。
		 * @param status 			 必选参数 : 评论内容。
		 * @param is_retweet 		 可选参数 : 是否转发 默认不转发 1为转发
		 * @param is_comment_to_root 可选参数 : 是否评论给原微博 默认不评论 1为评论
		 * 
		 */		
		
		public function reply (id:String, status:String, is_retweet:Boolean = false, is_comment_to_root:Boolean = false):void
		{
			oauth.addOAuthParameters ("id", id, false);
			oauth.addOAuthParameters ("status", status, true);
			
			if (is_retweet)
			{
				oauth.addOAuthParameters ("is_retweet", "1", false);
			}
			
			if (is_comment_to_root)
			{
				oauth.addOAuthParameters ("is_comment_to_root", "1", false);
			}
			
			//
			
			super.connect ("REPLY", "POST");
		}
		
		///
		///	[Retweet]
		///
		
		/**
		 * 
		 * <p>statuses/retweet</p> 
		 * <p>转发一条微博</p>
		 * 
		 * @param id 				 必选参数 : 值为被转发微博的ID
		 * @param status 			 必选参数 : 可选参数，评论内容，默认为“转发微博。”
		 * @param is_retweet 		 可选参数 : 是否评论 默认不评论 1为评论
		 * @param is_comment_to_root 可选参数 : 是否评论给原微博 默认不评论 1为评论
		 * 
		 */	
		
		public function retweet (id:String, status:String = null, is_comment:Boolean = false, is_comment_to_root:Boolean = false):void
		{
			oauth.addOAuthParameters ("id", id, false);
			oauth.addOAuthParameters ("status", status, true);
			
			if (is_comment)
			{
				oauth.addOAuthParameters ("is_comment", "1", false);
			}
			
			if (is_comment_to_root)
			{
				oauth.addOAuthParameters ("is_comment_to_root", "1", false);
			}
			
			//

			super.connect ("RETWEET", "POST", true, NEMConfig.RETWEET.replace ("[id]", id));
		}
		
		
		///
		///	[Show]
		///
		
		/**
		 * 
		 * <p>statuses/show</p>
		 * <p>获取单条微博信息。</p>
		 * <p>如果根据id没有找到对应微博则返回404状态。</p>
		 * 
		 * @param id 必选参数 : 值为被转发微博的ID。
		 * 
		 */		

		
		public function show (id:String):void
		{
			oauth.addOAuthParameters ("id", id, false);
			super.connect ("SHOW", "GET", true, NEMConfig.SHOW.replace ("[id]", id));
		}
		
		///
		///	[Destroy]
		///
		
		/**
		 * 
		 * <p>statuses/destroy</p>
		 * <p>删除指定的微博，也可以撤销已转发的微博。</p> 
		 * 
		 * @param id 必选参数 : 值为删除或撤销转发微博的ID。
		 * 
		 */		
		
		public function destroy (id:String):void
		{
			oauth.addOAuthParameters ("id", id, false);
			super.connect ("DESTROY", "POST", true, NEMConfig.DESTROY.replace ("[id]", id));
		}
		
		///
		///	[Comments]
		///
		
		/**
		 * 
		 * <p>statuses/comments</p>
		 * <p>查看指定微博的所有评论，返回的数据与WEB的单条微博页的评论列表数据一致。</p>
		 * <ul>
		 * 	<li>如果未使用oauth认证返回401;</li>
		 * 	<li>找不到微博返回404;</li>
		 * </ul>
		 *  
		 * @param id 		必选参数 : 指定的微博id;
		 * @param count 	可选参数 : 数量，默认为30条，最大为200条；
		 * @param since_id 	可选参数 : 该参数需传微博id，返回此条索引之前发的微博列表，不包含此条；
		 * @param max_id 	可选参数 : 该参数需传微博id，返回此条微博之后发的微博列表，包含此条；
		 * @param trim_user 可选参数 : 值为true时返回的user对象只包含id属性，该参数能在一定程度上减少返回的数据量。
		 * 
		 */

		public function comments (id:String, count:uint = 10, since_id:String = null, max_id:String = null, trim_user:Boolean = false):void
		{
			oauth.addOAuthParameters ("id", id, false);
			oauth.addOAuthParameters ("count", count.toString (), false);
			oauth.addOAuthParameters ("since_id", since_id, false);
			oauth.addOAuthParameters ("max_id", max_id, false);
			oauth.addOAuthParameters ("trim_user", trim_user.toString(), false);
			
			super.connect ("COMMENTS", "GET", true, NEMConfig.COMMENTS.replace ("[id]", id));
		}

		///
		///	[Retweets]
		///
		
		/**
		 * <p>statuses/retweets</p>
		 * <p>查看指定微博的所有转发信息，返回的数据与WEB上单条微博页的转发数据一致。</p>
		 * <ul>
		 * 	<li>如果未使用oauth认证返回401;</li>
		 * 	<li>找不到微博返回404;</li>
		 * </ul>
		 * 
		 * @param id 		必选参数 : 指定的微博id;
		 * @param count 	可选参数 : 数量，默认为30条，最大为200条；
		 * @param since_id 	可选参数 : 该参数需传微博id，返回此条索引之后发的微博列表，不包含此条；
		 * @param max_id 	可选参数 : 该参数需传微博id，返回此条微博之前发的微博列表，包含此条；
		 * @param trim_user 可选参数 : 值为true时返回的user对象只包含id属性，该参数能在一定程度上减少返回的数据量。
		 * 
		 */
		
		public function retweets (id:String, count:uint = 10, since_id:String = null, max_id:String = null, trim_user:Boolean = false):void
		{
			oauth.addOAuthParameters ("id", id, false);
			oauth.addOAuthParameters ("count", count.toString (), false);
			oauth.addOAuthParameters ("since_id", since_id, false);
			oauth.addOAuthParameters ("max_id", max_id, false);
			oauth.addOAuthParameters ("trim_user", trim_user.toString(), false);
			
			super.connect ("RETWEETS", "GET", true, NEMConfig.RETWEETS.replace ("[id]", id));
		}
		
		///
		///	[Retweeted by]
		///
		
		/**
		 * 
		 * <p>statuses/id/retweeted_by</p>
		 * <p>获取一条微博被转发的用户信息。</p>
		 * <p>根据id没有找到对应微博则返回404状态。</p>
		 * 
		 * @param id 	必选参数 : 值为被转发微博的ID。
		 * @param count 可选参数 : 返回的用户数量，默认为100条，最大100条；
		 * 
		 */	
		
		public function retweeted_by (retweetedId:String, count:uint = 10):void
		{
			oauth.addOAuthParameters ("retweetedId", retweetedId, false);
			oauth.addOAuthParameters ("count", count.toString (), false);
			
			super.connect ("RETWEETED_BY", "GET", true, NEMConfig.RETWEETED_BY.replace ("[id]", retweetedId));
		}
		
		///
		///	[upload]
		///
		
		/**
		 * 
		 * <p>statuses/upload</p>
		 * <p>上传图片文件并返回图片地址,将获得的图片地址通过发微博(statuses/update)接口附在微博正文里一同发出，则得到一个包含图片的微博。</p> 
		 * <ul>
		 * 	<li>如果未使用oauth认证返回401；</li>
		 * 	<li>图片超过大小限制或格式不正确则返回403;</li>
		 * 	<li>oauth相关参数请放在header里，不能放在body里，否则会返回401。</li>
		 * </ul>
		 * <p>注意：本接口只是传图，并不能发微博，如果发带图片的微博，请先调用本接口得到upload_image_url后，再调用statuses/update，并将upload_image_url作为作为status参数值</p>
		 * 
		 * @param imageName 必选参数 : 需要上传的图片的文件名.
		 * @param imageData 必选参数 : 需要上传的图片数据.
		 * 
		 */
		
		public function upload (imageName:String, imageData:ByteArray):void
		{
			super.action= "UPLOAD";
			
			uploader = new BDHttpLoader ();
			
			//
			
			uploader.method = "POST";
			uploader.addParameters ("pic", imageName, imageData);
			uploader.connect (oauth.getOAuthRequest ("POST", uri (action), null, true));
		
			//
			
			uploader.addEventListener (Event.COMPLETE, connectCompleteHandler);
			uploader.addEventListener (IOErrorEvent.IO_ERROR, connectErrorHandler);
		}
		
		///
		///	[Top retweets]
		///
		
		/**
		 * <p>statuses/topRetweets</p>
		 * <p>获取当前的热门转发榜。</p>
		 *  
		 * <ul>
		 * 	<li>如果用户通行证身份验证成功且用户已经开通微博则返回http状态为200；</li>
		 * 	<li>如果不是则返回401的状态和错误信息。</li>
		 * 	<li>type非法或者其对应的排行榜无数据则发挥404的状态。</li>
		 * </ul>
		 * 
		 * <p>返回说明</p>
		 * 
		 * <ul>
		 * 	<li>count：新增转发数，如果是1小时的转发榜，那么count就为1小时内的新增转发数</li>
		 * 	<li>retweet_count：转发总数</li>
		 * </ul>
		 * 
		 * @param type 必选参数 : 排行榜类型,当前有4种:oneHour,sixHours,oneDay,oneWeek
		 * @param size 可选参数 : 返回数量,不传则为默认值(当前为50),最多50
		 * 
		 */	
		
		public function top_retweets (type:String, size:String = "50"):void
		{
			oauth.addOAuthParameters ("type", type, false);
			oauth.addOAuthParameters ("size", size, false);

			super.connect ("TOP_RETWEETS","GET")
		}
		
		///
		///	[Recommended]
		///
		
		/**
		 * <p>trends/recommended</p> 
		 * <p>推荐话题API，其效果与“我的首页”右侧的推荐话题一致。</p>
		 * 
		 * <ul>
		 * 	<li>没有任何推荐话题返回404；</li>
		 * 	<li>推荐话题为专题时返回url，为话题时返回query。</li>
		 * </ul>
		 * 
		 * @param type
		 * @param size
		 * 
		 */	
		
		public function recommended ():void
		{
			super.connect ("RECOMMENDED","GET")
		}
	}
}